﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Modelo_ETdA.Negocio.Analise;
using Modelo_ETdA.Negocio.AmbienteComercial;
using Modelo_ETdA.Negocio.Analista;
using Modelo_ETdA.Dados;
using Modelo_ETdA.Negocio.Analise.Relatorio;
using Modelo_ETdA.Negocio.Analise.Avaliacao;
using Modelo_ETdA.Negocio.Analise.Formato;


namespace Modelo_ETdA.Interface
{
    public partial class MenuAnaliseETdA : Form
    {

        private GestorAnalise gAnalise;
        private GestorAnalista gAnalista;
        private GestorAmbienteComercial gAmbienteComercial;
        private MenuAnalista menuAnalist;
        private AmbienteComercial ambComerc;
        private Boolean first;

        public MenuAnaliseETdA(MenuAnalista menu, GestorAmbienteComercial gAmbCom, GestorAnalista gAnalista, int codAmbComer)
        {
            InitializeComponent();
            first = true;
            gAnalise = new GestorAnalise(gAmbCom.consultaAmbComercial(codAmbComer), null);
            menuAnalist = menu;
            this.gAnalista = gAnalista;
            ambComerc = gAmbCom.consultaAmbComercial(codAmbComer);
            gAmbienteComercial = gAmbCom;
            this.Text = "Ambiente Comercial - " + ambComerc.Cabeçalho.Nome;
            inicializaTabela();
        }

        public void inicializaTabela()
        {
            tabela.DataSource = gAnalise.getListAvalForm(ambComerc.Cabeçalho.Cod);
            if (first)
            {
                tabela.Columns[0].Width += 20;
                tabela.Columns[1].Width += 78;
                tabela.Columns[3].Width += 20;
                tabela.Columns[3].Width += 24;
                tabela.Columns[4].Width += 20;
                first = false;
            }
            tabela.Columns[0].HeaderText = "cod";
            tabela.Columns[1].HeaderText = "Nome";
            tabela.Columns[2].HeaderText = "Tipo";
            tabela.Columns[3].HeaderText = "Dimensão";
            tabela.Columns[4].HeaderText = "Registo";
            tabela.Columns[0].Visible = false;
        }

        private void MenuAnaliseETdA_FormClosed(object sender, FormClosedEventArgs e)
        {
            sair();
        }

        public void sair()
        {
            menuAnalist.sair();
        }

        private void verFicha_Click(object sender, EventArgs e)
        {
            try
            {
                this.Visible = false;
                Form next = new VerAmbComercial(this, gAmbienteComercial, ambComerc, gAnalista);
                next.Visible = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível consultar o ambiente comercial!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void voltar_Click(object sender, EventArgs e)
        {
            this.Visible = false;
            menuAnalist.Visible = true;
        }

        private void consultarFun()
        {
            try
            {
                if (tabela.SelectedRows.Count != 1)
                {
                    MessageBox.Show("Deve selecionar apenas um formato ou avaliação!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }


                int codForm = (int)tabela[0, tabela.SelectedRows[0].Index].Value;
                string tipo = (string)tabela[2, tabela.SelectedRows[0].Index].Value;
                string dim = (string)tabela[3, tabela.SelectedRows[0].Index].Value;

                Form next = null;
                switch (tipo)
                {
                    case "Formato":
                        switch (dim)
                        {
                            case "Cliente":
                                next = new VerFormatoCliente(gAnalise, this, codForm);
                                break;
                            case "Profissional":
                                next = new VerFormatoProfissional(gAnalise, this, codForm);
                                break;
                            case "Analista":
                                next = new VerFormatoAnalista(gAnalise, this, codForm);
                                break;
                        }
                        break;
                    case "Avaliação":
                        switch (dim)
                        {
                            case "Cliente":
                                next = new VerAvaliacaoCliente(gAnalise, codForm, this);
                                break;
                            case "Profissional":
                                next = new VerAvaliacaoProfissional(this, null, codForm, gAnalise, null, gAnalise.consultaListaConsideracao(), ambComerc, 0, null);
                                break;
                            case "Analista":
                                next = new VerAvaliacaoAnalista(this, gAnalise, codForm, ambComerc);
                                break;
                        }
                        break;
                }
                if (next != null)
                {
                    this.Visible = false;
                    next.Visible = true;
                }
                else MessageBox.Show("Não foi possível efectuar consulta!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception e)
            {
                MessageBox.Show("Não foi possivel efectuar consulta!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void consultar_Click(object sender, EventArgs e)
        {
            try
            {
                consultarFun();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível efectuar consulta!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void registarFormato_Click(object sender, EventArgs e)
        {
            try
            {
                this.Visible = false;
                RegistarFormato form = new RegistarFormato(this, gAnalise, ambComerc);
                form.Visible = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível registar formato!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void remover_Click(object sender, EventArgs e)
        {
            try
            {
                if (tabela.SelectedRows.Count != 1)
                {
                    MessageBox.Show("Deve selecionar apenas um formato!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                int codDoc = (int)tabela[0, tabela.SelectedRows[0].Index].Value;
                string tipo = (string)tabela[2, tabela.SelectedRows[0].Index].Value;
                string dim = (string)tabela[3, tabela.SelectedRows[0].Index].Value;

                int tipodoc = 0;
                if (tipo.Equals("Formato"))
                {
                    switch (dim)
                    {
                        case "Cliente":
                            tipodoc = 1;
                            break;
                        case "Profissional":
                            tipodoc = 2;
                            break;
                        case "Analista":
                            tipodoc = 3;
                            break;
                        default:
                            break;
                    }
                    gAnalise.removeDocumento(codDoc, tipodoc);
                    inicializaTabela();
                }
                else MessageBox.Show("Não foi seleccionado nenhum Formato!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível efectuar remoção!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void registarAvaliacao_Click(object sender, EventArgs e)
        {
            try
            {
                if (tabela.SelectedRows.Count > 1)
                {
                    MessageBox.Show("Deve selecionar apenas um formato!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                if (tabela.SelectedRows.Count == 0)
                {
                    MessageBox.Show("Deve selecionar pelo menos um formato!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                int codForm = (int)tabela[0, tabela.SelectedRows[0].Index].Value;
                string tipo = (string)tabela[2, tabela.SelectedRows[0].Index].Value;
                string dim = (string)tabela[3, tabela.SelectedRows[0].Index].Value;
                if (tipo.Equals("Formato"))
                {
                    switch (dim)
                    {
                        case "Cliente":
                            this.Visible = false;
                            RegistarAvaliacaoCliente ac = new RegistarAvaliacaoCliente(gAnalise, gAnalise.consultaFormatoAvaliacao(codForm, 1, ambComerc.Cabeçalho.Cod), this, null, null, "");
                            ac.Visible = true;
                            break;
                        case "Profissional":
                            this.Visible = false;
                            RegistarAvaliacaoProfissional ap = new RegistarAvaliacaoProfissional(this, gAnalise, gAnalise.consultaFormatoAvaliacao(codForm, 2, ambComerc.Cabeçalho.Cod), null);
                            ap.Visible = true;
                            break;
                        case "Analista":
                            this.Visible = false;
                            RegistarAvaliacaoAnalista aa = new RegistarAvaliacaoAnalista(this, gAnalise, gAnalise.consultaFormatoAvaliacao(codForm, 3, ambComerc.Cabeçalho.Cod));
                            aa.Visible = true;
                            break;
                        default:
                            break;
                    }

                }
                else MessageBox.Show("Não foi seleccionado nenhum Formato válido para registar Avaliação!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possivel registar avaliação.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void MenuAnaliseETdA_VisibleChanged(object sender, EventArgs e)
        {
            if (this.Visible)
                tabela.DataSource = gAnalise.getListAvalForm(ambComerc.Cabeçalho.Cod);
        }

        private void gerarRelatorio_Click(object sender, EventArgs e)
        {

            try
            {
                List<Avaliacao> avaliacaoCliente = new List<Avaliacao>();
                int i = 0;
                RelatorioCliente relCli;
                RelatorioProfissional relPro;
                List<Avaliacao> avaliacoesCli = null;
                List<Avaliacao> avaliacoesPro = null;
                List<Avaliacao> avaliacoesAna = null;
                FormatoAvaliacaoCliente formCli = null;
                FormatoAvaliacaoProfissional formPro = null;
                FormatoAvaliacaoAnalista formAna = null;

                if (tabela.SelectedRows.Count == 3 || tabela.SelectedRows.Count == 1)
                {
                    if (tabela.SelectedRows.Count == 3)
                    {
                        string dim1 = (string)tabela[3, tabela.SelectedRows[0].Index].Value;
                        string dim2 = (string)tabela[3, tabela.SelectedRows[1].Index].Value;
                        string dim3 = (string)tabela[3, tabela.SelectedRows[2].Index].Value;

                        if (dim1.Equals(dim2) || dim2.Equals(dim3) || dim3.Equals(dim1))
                        {
                            MessageBox.Show("Selecionou uma combinação de avaliações inválidas!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }
                    }

                    while (i < tabela.SelectedRows.Count)
                    {
                        int cod = (int)tabela[0, tabela.SelectedRows[i].Index].Value;
                        string tipo = (string)tabela[2, tabela.SelectedRows[i].Index].Value;
                        string dim = (string)tabela[3, tabela.SelectedRows[i].Index].Value;

                        if (tipo.Equals("Avaliação"))
                        {
                            switch (dim)
                            {
                                case "Cliente":
                                    avaliacoesCli = gAnalise.consultaAvaliacao(cod, 1);
                                    formCli = (FormatoAvaliacaoCliente)gAnalise.consultaFormatoAvaliacao(avaliacoesCli[0].CodForm, 1, ambComerc.Cabeçalho.Cod);
                                    if (tabela.SelectedRows.Count == 1)
                                    {
                                        relCli = new RelatorioCliente(avaliacoesCli, formCli, ambComerc);
                                        if (relCli.imprimir() != 0) MessageBox.Show("Relatório criado sem sucesso.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    }

                                    break;

                                case "Profissional":
                                    avaliacoesPro = gAnalise.consultaAvaliacao(cod, 2);
                                    formPro = (FormatoAvaliacaoProfissional)gAnalise.consultaFormatoAvaliacao(avaliacoesPro[0].CodForm, 2, ambComerc.Cabeçalho.Cod);
                                    if (tabela.SelectedRows.Count == 1)
                                    {
                                        relPro = new RelatorioProfissional(avaliacoesPro, formPro, ambComerc);
                                        if (relPro.imprimir() != 0) MessageBox.Show("Relatório criado sem sucesso.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    }

                                    break;

                                case "Analista":
                                    if (tabela.SelectedRows.Count == 1)
                                    {
                                        MessageBox.Show("Selecionou uma combinação de avaliações inválidas!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        return;
                                    }
                                    avaliacoesAna = gAnalise.consultaAvaliacao(cod, 3);
                                    formAna = (FormatoAvaliacaoAnalista)gAnalise.consultaFormatoAvaliacao(avaliacoesAna[0].CodForm, 3, ambComerc.Cabeçalho.Cod);
                                    break;
                                default:
                                    break;
                            }

                        }
                        else
                        {
                            MessageBox.Show("Foi selecionado um formato errado!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            return;
                        }
                        i++;
                    }
                    TipoRelatorio tipRel;
                    if (tabela.SelectedRows.Count == 3)
                    {
                        tipRel = new TipoRelatorio(this, avaliacoesCli, avaliacoesPro, avaliacoesAna,
                            formCli, formPro, formAna, ambComerc);
                        tipRel.Visible = true;
                        this.Visible = false;
                    }

                }
                else
                {
                    MessageBox.Show("Foi selecionado um formato errado!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Relatório criado sem sucesso.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void tabela_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode.ToString().Equals("Return"))
            {
                consultarFun();
            }

            if (e.KeyCode == Keys.Back)
            {
                this.Visible = false;
                menuAnalist.Visible = true;
            }
        }


    }
}
